Binary Search

이진 탐색(Binary Search)
항상 부모 노드가 왼쪽 자식보다는 크고, 오른쪽 자식보다는 작다.
한번 탐색할때마다 보아야 할 원소의 개수가 절반씩 줄어든다는 점에서
‘완전 이진 트리’인 경우 탐색 시간이 O(logN)의 시간 복잡도를 가진다.
이진 탐색 과정
찾고자 하는 값이 부모 노드보다 작을 경우 왼쪽 자식으로,
찾고자 하는 값이 부모 노드보다 클 경우 오른쪽 자식으로 이어 나가면서 방문한다.
이진 트리 삭제 과정
자식이 없는 경우: 단순히 제거
자식이 하나만 있는 경우: 삭제할 노드의 자리에 자식을 넣는다.
자식이 둘인 경우: 자기 다음으로 큰 노드를 넣는다.
#include<stdio.h>
#include<stdlib.h>
typedef struct{
int data;
struct Node *leftChild;
struct Node *rightChild;
}Node;
Node *insertNode (Node* root, int data){
if (root==NULL){
root=(Node *)malloc(sizeof(Node));
root->leftChild=root->rightChild=NULL;
root->data=data;
return root;
}
else{
if(root->data > data){
root->leftChild=insertNode(root->leftChild, data);
}
else{
root->rightChild=insertNode(root->rightChild, data);
}
}
return root;
}
Node *searchNode(Node* root, int data){
if(root==NULL)return NULL;
if(root->data==data)return root;
else if(root->data>data)return searchNode(root->leftChild, data);
else return searchNode(root->rightChild, data);
}
void pre_order(Node* root){
if(root==NULL)return;
printf("%d ",root->data);
pre_order(root->leftChild);
pre_order(root->rightChild);
}
Node* findMinNode(Node* root){
Node *node=root;
while(node->leftChild!=NULL){
node=node->leftChild;
}
return node;
}
Node* deleteNode(Node* root, int data){
Node *node=NULL;
if(root==NULL)return NULL;
if(root->data>data)root->leftChild=deleteNode(root->leftChild,data);
else if(root->data<data)root->rightChild=deleteNode(root->rightChild, data);
else{
if(root->leftChild!=NULL && root->rightChild!=NULL){
node=findMinNode(root->rightChild);
root->data=node->data;
root->rightChild=deleteNode(root->rightChild,node->data);
}
else{
node=(root->leftChild!=NULL)?root->leftChild:root->rightChild;
free(root);
return node;
}
}
return root;
}
int main(void){
Node* root=NULL;
root=insertNode(root, 30);
root=insertNode(root, 17);
root=insertNode(root, 48);
root=insertNode(root, 5);
root=insertNode(root, 23);
root=insertNode(root, 37);
root=insertNode(root, 50);
root=deleteNode(root, 30);
pre_order(root);
system("pause");
return 0;
}
이진 탐색 트리의 성능을 최대한 끌어올리기 위해서는 이진 탐색 트리가 완전 이진트리에 가까워 질 수 있도록 설계하여야 한다.
정상적으로 설계된 완전 이진트리(Complete Binary Tree)에서는 어떠한 원소라도 탐색함에 있어서 O(logN)의 시간이 소요
편향 이진 트리(Skewed Binary Tree)의 경우 탐색에 있어 O(N)의 시간 복잡도가 형성
기존의 배열(Array)보다 오히려 많은 공간과 시간이 낭비된다.
트리의 효율성
트리(Tree)를 이용하면 데이터를 효율적으로 처리할 수 있다. 트리에서 데이터의 개수가 N개 일때, 배열과 마찬가지로 O(N)의 공간만이 소요되며,
삽입 및 삭제에 있어서 일반적인 경우 배열(Array)를 이용하는 것보다 효율적이다.
그래서 데이터베이스 등 대용량 저장 및 검색 자료구조로 많이 활용된다.